#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<int, int>;
#define rep(i, a, b) for (int i = (a); i <= (b); i++)
#define per(i, a, b) for (int i = (a); i >= (b); i--)
#define endl '\n'
const int N = 2005;

int n, m;
struct Seg {
  int l, r, id;
} seg[N];
int b[N << 1], num;
vector<int> l2r[N << 1];
vector<int> r2l[N << 1];
int id[N << 1][N << 1];
bool cmpr(const Seg& a, const Seg& b) {
  if (a.r != b.r)
    return a.r < b.r;
  else
    return a.l > b.r;
}
void discrete() {
  rep(i, 1, n) {
    b[i] = seg[i].l;
    b[i + n] = seg[i].r;
  }
  sort(b + 1, b + n * 2 + 1);
  num = unique(b + 1, b + n * 2 + 1) - b - 1;
  rep(i, 1, n) {
    seg[i].l = lower_bound(b + 1, b + num + 1, seg[i].l) - b;
    seg[i].r = lower_bound(b + 1, b + num + 1, seg[i].r) - b;
  }
}
int dp[N << 1][N << 1];
int sel[N << 1][N << 1];
void dfs(int l, int r, vector<int>& ans) {
  if (l >= r) return;
  if (id[l][r]) ans.push_back(id[l][r]);
  if (!sel[l][r]) return;
  dfs(l, sel[l][r], ans);
  dfs(sel[l][r], r, ans);
}
void solve() {
  cin >> n;
  rep(i, 1, n) {
    int c, r;
    cin >> c >> r;
    seg[i] = {c - r, c + r, i};
  }
  discrete();
  sort(seg + 1, seg + n + 1, cmpr);
  rep(i, 1, n) id[seg[i].l][seg[i].r] = seg[i].id;
  rep(i, 1, n) {
    l2r[seg[i].l].push_back(seg[i].r);
    r2l[seg[i].r].push_back(seg[i].l);
  }
  rep(len, 2, num) {
    rep(i, 1, num + 1 - len) {
      int j = i + len - 1;
      dp[i][j] = dp[i + 1][j];
      if (j > i + 1) sel[i][j] = i + 1;
      for (int k : l2r[i]) {
        if (k >= j) continue;  // break ?
        if (dp[i][k] + dp[k][j] > dp[i][j])
          dp[i][j] = dp[i][k] + dp[k][j], sel[i][j] = k;
      }
      if (id[i][j]) dp[i][j]++;
    }
  }
  vector<int> ans;
  dfs(1, num, ans);
  sort(ans.begin(), ans.end());
  cout << ans.size() << endl;
  for (int x : ans) cout << x << ' ';
  cout << endl;
  return;
}
int main() {
  ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  int t;
  t = 1;
  while (t--) solve();
  return 0;
}